package main

import "strconv"

/*
	第 N 位数字
在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 位数字。
注意：n 是正数且在 32 位整数范围内（n < 231）。

示例 1：
输入：3
输出：3

示例 2：
输入：11
输出：0
解释：第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ，它是 10 的一部分。
 */

func findNthDigit(n int) int {
	digits := 1
	flag := 9
	// 求n所在的数为几位数
	/*
	以11为例   11 - 9 > 0 && 11 - 9 - 90*2 < 0   故在两位数
	以200为例  200 - 9 - 90 * 2 > 0 && 200 - 9 - 90 * 2 - 900 * 3  < 0   故在三位数
	 */
	for n-flag*digits > 0 {
		n = n - flag*digits
		flag = flag * 10
		digits++
	}
	// 若n为个位数，返回n即可
	if digits == 1 {
		return n
	}
	number := 1
	for k := 1; k < digits; k++ {
		number = number * 10
	}
	// 求n对应的数
	/*
	以n=11 为例 知道n为两位数(digits=2)后 i=n-9*1=2 说明n在以两位数为开始的第2个字符所在的数，为10
	（i-1）/digits =0 ==》 11所在的数为10+0=10
	（i-1）%digits=1 ==》 说明11对应的数字10的第1位(从左往右数，从0开始)
	可以将10转换为字符串/字符数组，取数组下标为（i-1）%digits的字符，再将其转换为数字

	 */
	number = number + (n-1)/digits
	idx := (n - 1) % digits
	// 将n对应的数转换为字符串类型，取第idx位并转换为整数
	strnums := strconv.Itoa(number)
	res, _ := strconv.Atoi(string(strnums[idx]))
	return res

}

func main() {

}
